// 构建脚本 - 生成构建信息
use chrono::Local;
use std::fs::File;
use std::io::Write;
use std::path::Path;
use std::process::Command;

fn main() {
    // 获取当前时间
    let build_date = Local::now().format("%Y-%m-%d %H:%M:%S").to_string();

    // 获取Rust版本信息
    let rust_version = get_rust_version();

    // 获取目标平台信息
    let target_arch =
        std::env::var("CARGO_CFG_TARGET_ARCH").unwrap_or_else(|_| "unknown".to_string());
    let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap_or_else(|_| "unknown".to_string());

    // 在Windows上设置更大的栈大小
    if target_os == "windows" {
        println!("cargo:rustc-link-arg=/STACK:16777216"); // 16MB stack
    }
    // 在 Linux 上设置更大的栈大小
    if target_os == "linux" {
        println!("cargo:rustc-link-arg=-Wl,--stack,16777216"); // 16MB stack
    }
    // 在 macOS 上设置更大的栈大小
    if target_os == "macos" {
        println!("cargo:rustc-link-arg=-Wl,-stack_size,16777216"); // 16MB stack
    }
    // 在 BSD 上设置更大的栈大小
    if target_os == "freebsd" || target_os == "netbsd" || target_os == "openbsd" {
        println!("cargo:rustc-link-arg=-Wl,-stack_size,16777216"); // 16MB stack
    }

    // 生成构建信息文件
    let out_dir = std::env::var("OUT_DIR").unwrap();
    let dest_path = Path::new(&out_dir).join("build_info.rs");

    let mut f = File::create(&dest_path).unwrap();

    writeln!(f, "/// 构建信息").unwrap();
    writeln!(f, "pub const BUILD_DATE: &str = \"{}\";", build_date).unwrap();
    writeln!(
        f,
        "pub const VERSION: &str = \"{}\";",
        env!("CARGO_PKG_VERSION")
    )
    .unwrap();
    writeln!(f, "pub const NAME: &str = \"{}\";", env!("CARGO_PKG_NAME")).unwrap();
    writeln!(f, "pub const RUST_VERSION: &str = \"{}\";", rust_version).unwrap();
    writeln!(f, "pub const TARGET_ARCH: &str = \"{}\";", target_arch).unwrap();
    writeln!(f, "pub const TARGET_OS: &str = \"{}\";", target_os).unwrap();

    // 告诉Cargo重新运行构建脚本的条件
    println!("cargo:rerun-if-changed=build.rs");
    println!("cargo:rerun-if-changed=Cargo.toml");
}

/// 获取Rust版本信息
fn get_rust_version() -> String {
    match Command::new("rustc").arg("--version").output() {
        Ok(output) => {
            if output.status.success() {
                let version = String::from_utf8_lossy(&output.stdout);
                if let Some(first_line) = version.lines().next() {
                    let parts: Vec<&str> = first_line.split_whitespace().collect();
                    if parts.len() >= 2 {
                        return format!("{} {}", parts[0], parts[1]);
                    }
                }
            }
            "rustc 1.70.0".to_string()
        }
        Err(_) => {
            eprintln!("Warning: 无法获取Rust版本，使用默认版本");
            "rustc 1.70.0".to_string()
        }
    }
}
